<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 
        一、代码分类
            1、全局代码
            2、函数(局部)代码
        二、全局执行上下文
            1、在执行全局代码前将Window确定为全局执行上下文
            2、对全局代码进行预处理
               1)var 定义的全局变量 ==> undefind, 并添加为window是我属性
               2)function声明的全局函数 ==> 赋值(fun), 并添加为Window的方法
               3)this ==> 赋值window
        三、函数执行上下文
            1、在调用函数，准备执行函数体之前，创建对应的函数执行上下文对象(虚拟的，存在栈当中)
            2、对局部数据进行预处理
               1) 形参变量 ==> 赋值(实参) ==> 添加添加为执行上下文的属性
               2) arguments ==> 赋值(实参列表)，添加为执行上下文的属性
               3) var定义的局部变量 ==> 赋值为undefined， 添加为执行上下文的属性
               4) function 生命的函数 ==> 赋值(fun) 添加为执行上下文的方法
               5) this ==> 赋值(调用函数的对象)
            3、开始执行代码
     -->

     <script>
        /* 全局上下文 */
        console.log(a, window.a)  // 等同于在window里面找
        a2()
        console.log(this)
        var a = 3 
        function a2 () { 
            console.log('a2()')
        }

        /* 函数执行上下文 */
        function fn (a1) { 
            console.log(a1) // a1
            console.log(a2) // undefind
            a3() // a3()
            console.log(this) // window
            console.log(arguments) // 伪数组  输出2，3

            var a2 = 3 
            function a3 ()  { 
                console.log('a3()')
            }
        }
        fu(2, 3)
    </script>
</body>
</html>